package com.admin.business.background.approval;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.tiangong.framework.bo.CDO;
import com.zmbsms.os.core.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;


@Service("ApprovalService")
@Slf4j
public class ApprovalService {



    @Resource
    ApprovalDao approvalDao;



    /**
     * 操作人，所需审批等级
     *
     * @param user_id
     * @param grade
     * @return
     */
    public Boolean verifyDataInfoState(String user_id, Integer grade, String post_id) {
        //一级审批需要部门负责人确认，二级审批需要项目负责人确认 三级审批需要分公司负责人确认 四级需要总公司负责人确认
        //根据post_id获取部门，项目公司信息
        //再查询该人在该条线上的角色进行判断是否审批
        Boolean isOrgSys = false;//可以为分公司或总公司
        Boolean isProSys = false;
        Boolean isDeptSys = false;
        Boolean isOrgParSys = false;//总公司负责人

        CDO postInfo = approvalDao.getPostInfoByPostId(post_id);
        //判断操作人在该线承担什么角色
        String org_id = postInfo.getString("org_id");//公司id，不为空
        String dept_id = postInfo.getString("dept_id");//部门id，不为空
        String pro_id = postInfo.getString("pro_id");//所属项目id，可能为空
        String org_sys_id = postInfo.getString("org_sys_id");//公司负责人
        String pro_sys_id = postInfo.getString("pro_sys_id");//项目负责人
        String dept_sys_id = postInfo.getString("dept_sys_id");//部门负责人
        String org_biggest_id = postInfo.getString("org_biggest_id");//总公司id，0及无总公司

        //2022-11-2，执行总经理和管理员一致
        String parentOrgId = org_biggest_id.equals("0") ? org_id : org_biggest_id;//总公司id
        CDO orgToeal=new CDO();
        orgToeal.set("user_id",user_id);
        orgToeal.set("parentOrgId",parentOrgId);
        int total = approvalDao.getOrgTotalByUserIdAndOrgId(orgToeal);
        if (total > 0) {
            isOrgParSys = true;
        }
        if (user_id.equals(StringUtils.isEmpty(org_sys_id) ? "" : org_sys_id)) {
            isOrgSys = true;
        }
        if (user_id.equals(StringUtils.isEmpty(pro_sys_id) ? "" : pro_sys_id)) {
            isProSys = true;
        }
        if (user_id.equals(StringUtils.isEmpty(dept_sys_id) ? "" : dept_sys_id)) {
            isDeptSys = true;
        }
        Boolean whetherToApprove = true;//是否需要审批
        //审批等级为1
        switch (grade) {
            case 1:
                //操作人为该线的任意一个负责人都可直接过
                //至少至部门负责人审批
                if (isOrgSys || isProSys || isDeptSys) {
                    whetherToApprove = false;
                }
                break;
            case 2:
                //操作人为该线部门以上的负责人，（项目，公司负责人直接过）
                //至少至项目负责人审批
                if (isOrgSys || isProSys) {
                    whetherToApprove = false;
                }
                break;
            case 3:
                //至少至分公司负责人审批
                if (isOrgSys) {
                    whetherToApprove = false;
                }
                break;
            case 4:
                //至少到总公司负责人
                if (isOrgParSys) {
                    whetherToApprove = false;
                }
                break;
        }

        //是总公司负责人直接过
        if (isOrgParSys) {
            whetherToApprove = false;
        }

        return whetherToApprove;
    }








    /**
     * 根据user_id和总公司id获取上一级的user_id
     *
     * @param user_id 查询对象id
     * @param org_id  查询对象所处总公司id
     * @return
     */
    public String getBossUserIdByUserIdAndOrgId(String user_id, String org_id) {
        String user_id_boss = null;//上级user_id
        List<CDO> employeeList = approvalDao.getOrgProDeptPostListByOrgIdAndUserId(org_id, user_id);
        for (CDO cdo : employeeList) {
            String orgId = cdo.getString("org_id");//所处公司
            String org_parent_id = cdo.getString("org_parent_id");//父级公司，判断是否为总公司，0为总公司
            String org_sys_user_id = cdo.getString("org_sys_user_id");//所处公司负责人
            String pro_id = cdo.getString("pro_id");//所处项目
            String pro_sys_user_id = cdo.getString("pro_sys_user_id");//所处项目负责人
            String dept_id = cdo.getString("dept_id");//所处部门
            String dept_sys_user_id = cdo.getString("dept_sys_user_id");//所处部门负责人
            String post_id = cdo.getString("post_id");//所处岗位，岗位无负责人
            //先查部门，再查项目，再查分公司||公司，
            Integer deptState = this.judgmentHeadInfo(2, null, user_id, dept_sys_user_id);
            if (deptState == 0) {
                user_id_boss = dept_sys_user_id;
                break;
            }
            Integer proState = this.judgmentHeadInfo(1, null, user_id, pro_sys_user_id);
            if (proState == 0) {
                user_id_boss = pro_sys_user_id;
                break;
            }

            Integer orgState = this.judgmentHeadInfo(0, org_parent_id, user_id, org_sys_user_id);
            if (orgState == 0) {
                user_id_boss = org_sys_user_id;
                break;
            }
        }
        if (StringUtils.isEmpty(user_id_boss)) {
            //返回总公司负责人
            //2022-11-02， 法人为最高审批人，有执行总经理为执行总经理最高审批
            CDO orgSysInfo = approvalDao.getOrgSysUserIdByOrgId(org_id);
            //法人
            String org_legal_person_id = orgSysInfo.getString("org_legal_person_id");
            //管理员
            String org_admin_id = orgSysInfo.getString("org_admin_id");
            //执行总经理
            String org_cadre_id = orgSysInfo.getString("org_cadre_id");
            org_legal_person_id = !StringUtils.isEmpty(org_cadre_id) ? org_cadre_id : org_legal_person_id;
            if (!StringUtils.isEmpty(org_legal_person_id)) {
                if (!org_legal_person_id.equals(user_id)) {
                    user_id_boss = org_legal_person_id;
                }
            }
        }
        return user_id_boss;
    }


    /**
     * @param judgmentType  校验类型 ：0公司   1项目   2.部门
     * @param org_parent_id 可为null
     * @param user_id       操作人
     * @param sys_user_id   负责人，可为null
     * @return
     */
    public Integer judgmentHeadInfo(Integer judgmentType, String org_parent_id, String user_id, String sys_user_id) {
        Integer state = 0;//0.不是负责人 1.是负责人 2.总公司负责人
        if (!StringUtils.isEmpty(sys_user_id)) {
            if (user_id.equals(sys_user_id)) {
                //是负责人，
                state = 1;
                //判断是总公司还是分公司
                if (judgmentType == 0) {
                    if (!StringUtils.isEmpty(org_parent_id)) {
                        if (org_parent_id.equals("0")) {
                            state = 2;
                        }
                    }
                }
            }
        }
        return state;
    }

}
